Go interfaces can embed other interfaces to build larger contracts from smaller ones, following the Interface Segregation Principle and making mocking in tests trivial.
Keep interfaces small — the io.Reader/io.Writer pattern (one or two methods) is idiomatic
Define interfaces in the package that uses them, not the package that implements them
Compose interfaces at the point where a broader contract is genuinely needed
Narrow interfaces make unit testing easy — mocks only need to implement what is used
Accept interfaces, return concrete types is a common Go guideline